﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Reflection;
using csNotificaciones;
using MotorMetricas.Datos;
using MotorMetricas.Entidades;
using MotorMetricas.Datos.Interfaces;
using MotorMetricas.Datos.FabricaDatos;

namespace MotorMetricas.Logica
{
    public class Instanciador
    {

        static public void Invocar(int IdProyecto, int IdMetrica, string PathDll , string PathLocalProyecto)
        {
            object[] argumentos = new object[] { PathLocalProyecto };
            object ResultadoMetrica;
            string metodo = "Generar";

            try
            {
                ManejoArchivo Manejador = new ManejoArchivo();
                if (Manejador.ValidarArchivo(PathDll))
                {
                    Assembly a = Assembly.LoadFrom(PathDll);
                  //  AccesoReporte accesoReporte = new AccesoReporte();
                    Reporte reporte = new Reporte();

                    foreach (Type tipo in a.GetTypes())
                    {
                        if (tipo.IsClass == true)
                        {
                            object Objeto = Activator.CreateInstance(tipo);

                            //metodo.Invoke(o, null);
                            ResultadoMetrica = tipo.InvokeMember(metodo,
                                        BindingFlags.Default | BindingFlags.InvokeMethod,
                                        null,
                                        Objeto,
                                        argumentos);

                            reporte.IdProyecto = IdProyecto;
                            reporte.IdMetrica = IdMetrica;
                            reporte.Contador = int.Parse(ResultadoMetrica.ToString());
                            reporte.FechaEjecucion = DateTime.Today;

                            IDaoAccesoReporte DaoReporte = FabricaDao.ObtenerFabricaDeDao(1).ObtenerDaoReporte();
                            DaoReporte.InsertarReporte(reporte);

                        }
                    }
                }
                else
                {
                    Notificacion.mostrarVentana("Ha ocurrido un error", "No se encontró el archivo\n" + PathDll, Notificacion.Imagen.Error, 3);
                }
            }
            catch (FileNotFoundException)
            {
                Notificacion.mostrarVentana("Ha Ocurrio un Error", "No se encontró el archivo:\n" + PathDll, Notificacion.Imagen.Error, 3);
            }
            catch (MissingMethodException)
            {
                Notificacion.mostrarVentana("Ha Ocurrio un Error", "No se encontró una implementacion del \n método 'Generar' en la libreria\n" + PathDll, Notificacion.Imagen.Error, 2);
            }
            catch (Exception)
            {
                Notificacion.mostrarVentana("Ha Ocurrio un Error", "Error inesperado", Notificacion.Imagen.Error, 2);
            }

            
        }

    }
}
